import java.lang.reflect.Field;

public class EqualExample
{
    public int x;
    public int y;

    public static void main(String[] args) {
        EqualExample e1=new EqualExample();
        e1.x=1;
        e1.y=2;
        System.out.println(e1.equals(e1));
        EqualExample e2=new EqualExample();
        e2.x=13;
        e2.y=2;
        System.out.println(e1.equals(e2));
    }




    @Override
    public boolean equals(Object o) {
        //检查是否为同一个对象的引用，如果是直接返回 true；
        //检查是否是同一个类型，如果不是，直接返回 false；
        //将 Object 对象进行转型；
        //判断每个关键域是否相等。
        if(this==o)
        {
            //引用相同
            return true;
        }
        //类型判断和空判断
        if(o==null || getClass()!=o.getClass())
        {
            return false;

        }
        //对象深度判断
        //可以通过反射拿
        Class<?> aClass=o.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field : declaredFields)
        {
            field.setAccessible(true); // 允许访问私有字段
            try {
                Object value1 =  field.get(o);
                Object value2= field.get(this);
                if(value1==null)
                {
                    if(value2!=null)
                    {
                        return false;
                    }
                }
                else
                {
                    if(!value1.equals(value2))
                    {
                        return false;
                    }
                }


            } catch (IllegalAccessException e) {
                e.printStackTrace(); // 处理异常
            }


        }


        return true;
    }



}
